/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package chatdistribuidos;

import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import View.*;

/**
 *
 * @author Kleyvert
 */
public class Cliente implements Runnable
{

    //ATRIBUTOS:
   private Socket clienteConexion;
   private String ipServidor= "127.0.0.1";
   private int puerto;
   private String nombreUsuario;
   private String nombreSala;
   private boolean conexionBool;
   private ClienteView ventana;
   private DataOutputStream msnSalida;
   private DataInputStream msnEntrada;

    //CONSTRUCTOR:

    public Cliente(int puerto, String nombreUsuario, String nombreSala, ClienteView ventana) throws IOException {
       this.nombreUsuario = nombreUsuario;
       this.nombreSala = nombreSala;
       this.ventana = ventana;
       this.puerto = puerto;
       
      // this.enviarMensaje(1, nombreUsuario);
    }

    public Cliente() {
    }



   //METODOS:

    public Socket getClienteConexion() {
        return clienteConexion;
    }
    public void setClienteConexion(Socket clienteConexion) {
        this.clienteConexion = clienteConexion;
    }
    public String getIpServidor() {
        return ipServidor;
    }
    public void setIpServidor(String ipServidor) {
        this.ipServidor = ipServidor;
    }
    public DataInputStream getMsnEntrada() {
        return msnEntrada;
    }
    public void setMsnEntrada(DataInputStream msnEntrada) {
        this.msnEntrada = msnEntrada;
    }
    public DataOutputStream getMsnSalida() {
        return msnSalida;
    }
    public void setMsnSalida(DataOutputStream msnSalida) {
        this.msnSalida = msnSalida;
    }


    // levantar el cliente socket
   public void LevantarCliente(){

        // colocamos el servidor como un "Demonio" escuchando conexiones
        try {
            this.setClienteConexion(new Socket(ipServidor, puerto));
            System.out.println("Conectado al Socket: " + clienteConexion.getInetAddress());
            // Seteamos la el InputStream con la conexion de un determinado cliente Socket
            this.setMsnEntrada(new DataInputStream(this.getClienteConexion().getInputStream()));
            this.enviarMensaje(1, nombreUsuario);
            conexionBool = true;
            while(conexionBool){
                // Leemos el identificar y el mensaje de la conexion Sockets
                int codigoVerificar = this.getMsnEntrada().readInt();
                String sTrama = this.getMsnEntrada().readUTF();
                /*System.out.println("IMPRIMIO: "+ sTrama);
                System.out.println("ID: "+ codigoVerificar);*/

                if (codigoVerificar == 1){
                    ventana.getListaModal().removeElement(sTrama);
                    ventana.nuevoUsuario(sTrama);
                }
                if ( codigoVerificar == 2 || codigoVerificar == 4){
                    ventana.mensajeRecibidoPorCadaUsuario(sTrama);

                }
                if (codigoVerificar == 3 ){
                    ventana.EliminarUsuario(sTrama);             
                }
            }
        }
        catch (IOException ex) {
            JOptionPane.showMessageDialog(ventana, "No se pudo establecer la conexión");
        }      // procesar la conexión.
       
   }

     // Enviar menaje al servidor
    public void enviarMensaje(int codigo, String mensaje){
        try{
            this.setMsnSalida(new DataOutputStream(this.getClienteConexion().getOutputStream()));
            this.getMsnSalida().writeInt(codigo);
            this.getMsnSalida().writeUTF(mensaje);
        }catch(Exception e){
            JOptionPane.showMessageDialog(ventana, "No se pudo enviar el mensaje");
        }
    }
   
   // Metodo para cerrar la conexiones tanto de "espera" como de "salida"
   public void cerrarConexion()
   {
        try {
          
           this.getClienteConexion().close();
        }
        catch( IOException excepcionES ) {
              excepcionES.printStackTrace();
        }
      System.out.println("Conexion finalizada");
   }

    
    public void run() {
      this.LevantarCliente();
      
    }

}
